package cn.lg.soar.system.monitor.service;


import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.system.monitor.entity.RefreshToken;
import com.baomidou.mybatisplus.extension.service.IService;
import eu.bitwalker.useragentutils.DeviceType;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 *
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IRefreshTokenService extends IService<RefreshToken> {

    /**
     * 根据用户id删除 RefreshToken
     * @param userId
     * @return
     */
    Set<String> removeByUserId(Serializable userId);

    /**
     * 根据用户id和设备类型删除 RefreshToken
     * @param userId
     * @param deviceType
     * @return
     */
    Set<String> removeByUserId(Serializable userId, Integer deviceType);

    /**
     * 创建token
     * @param userId
     * @return
     */
    String create(Long userId, boolean rememberMe);

    /**
     * 清除token
     */
    void clear();

    /**
     * 清除token
     * @param userId
     * @param deviceTypes
     */
    void clear(Long userId, Collection<DeviceType> deviceTypes);

    /**
     * 清除token
     * @param userId
     * @param deviceType
     */
    default void clear(Long userId, DeviceType[] deviceType) {
        clear(userId, DataUtil.arrayToList(deviceType));
    }

    /**
     * 刷新token
     * @param refreshToken
     * @return
     */
    String refresh(String refreshToken);

    /**
     * 验证刷新token
     * @param refreshToken
     * @return
     */
    RefreshToken verify(String refreshToken);

    /**
     * 根据用户id获取tokenid
     * @param userIds
     * @return
     */
    default List<String> idsByUserId(Long... userIds) {
        return idsByUserId(Arrays.asList(userIds), null);
    }

    /**
     * 根据用户id和设备类型获取tokenid
     * @param deviceType
     * @param userIds
     * @return
     */
    List<String> idsByUserId(List<Long> userIds, DeviceType deviceType);

    default List<String> idsByUserIdAndActive(Long... userIds) {
        return idsByUserIdAndActive(Arrays.asList(userIds), null);
    }

    List<String> idsByUserIdAndActive(List<Long> userIds, DeviceType deviceType);

    /**
     * 优化（剔除失效的数据）
     */
    void optimize();

}
